package com.itheima.polymorphsm3;

public class Test1 {

    public static void main(String[] args) {

        //多态的优点：1.右边对象是解耦合的，便于扩展和维护
        //Animal a1 = new Tortoise();
        /*Animal a1 = new Wolf();   //更换方便
        a1.run();*/

        Animal a1 = new Tortoise();
        start(a1);
        System.out.println("------------------");
        Animal a2 = new Wolf();
        start(a2);

        System.out.println("------------------");

        Animal a3 = new Tortoise();
        //a3.swim();   //报错，多态下不能使用子类的独有功能

        //注意：1.存在继承或实现关系就可以在编译阶段进行强制类型转换，编译阶段不会报错
        //2.运行时，如果发现对象的真实类型与强转后的类型不同，就会报类型转换异常（ClassCastException）的错误
        /*Wolf w = (Wolf) a3;*/

        //强转前，Java建议使用 instanceof 关键字判断当前对象的真实类型，再进行强转
        if (a3 instanceof Wolf) {
            Wolf w = (Wolf) a3;
            w.eatSheep();
        } else if (a3 instanceof Tortoise) {
            Tortoise t = (Tortoise) a3;
            t.swim();
        }

        System.out.println("------------------");

        //自动类型转换：父类 变量名 = new 子类();
        //强制类型转换：子类 变量名 = (子类)父类变量;
        /*Tortoise t = (Tortoise) a3;
        t.swim();*/


    }

    //多态的优点：2.定义方法时，使用父类类型的形参，可以接收一切子类对象，扩展性高
    public static void start(Animal a) {
        System.out.println("开始跑：");
        a.run();
        //a.swim();   //报错，多态下不能使用子类的独有功能

        //强转前，Java建议使用 instanceof 关键字判断当前对象的真实类型，再进行强转
        if (a instanceof Wolf) {
            Wolf w = (Wolf) a;
            w.eatSheep();
        } else if (a instanceof Tortoise) {
            Tortoise t = (Tortoise) a;
            t.swim();
        }
    }
}
